package com.aaa.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import com.aaa.entity.MyReturn;


import java.util.HashMap;
import java.util.Map;

/**
 * @author ：Teacher陈（86521760@qq.com）
 * @date ：Created in 2022/6/2 10:53
 * @description：我的工具类
 * @modified By：
 * @version: 1.0
 */
public class MyTools {
    /**
     * @param oldSql    老的sql
     * @param map       传入的参数
     * @param countFlag 是否获取总条数
     * @return String  新的sql
     * @create by: Teacher陈（86521760@qq.com）
     * @description: 组装sql语句
     * @create time: 2022/6/2 10:53
     */
    public static String makeSql(String oldSql, Map<String, Object> map, boolean countFlag) {
        //1、非空判断
        StringBuffer sql = new StringBuffer(oldSql);
        if (map != null || map.size() > 0) {

            //获取所有的查询条件
            Map<String, String> whereMap = new HashMap<>();
            for (String key : map.keySet()) {
                if (key.contains("search")) {
                    //去掉前缀的search标记，方便sql语句查询
                    whereMap.put(key.replace("search", ""), map.get(key) + "");
                }
            }
            //拼接where查询条件
            for (Map.Entry<String, String> entry : whereMap.entrySet()) {
                sql.append(" and " + entry.getKey() + " like " + " '%" + entry.getValue() + "%' ");
            }
            //3、判断是否排序
            if (ObjectUtil.isNotEmpty(map.get("field"))) {
                String field = map.get("field") + "";
                String order = map.get("order") + "";
                sql.append(" order by ").append(field).append(" ").append(order);
            }
            //如果不是获取总条数，开始分页查询
            if (!countFlag) {
                //2、判断是否分页
                if (ObjectUtil.isNotEmpty(map.get("page"))) {
                    Integer page = Integer.parseInt(map.get("page") + "");
                    Integer limit = Integer.parseInt(map.get("limit") + "");
                    sql.append(" limit ").append((page - 1) * limit).append(",").append(limit);
                }
            }


        }
        String string = sql.toString();
        return string;

    }

    /**
     * @param myReturn
     * @return MyResult
     * @create by: Teacher陈
     * @description: 传入一个原始返回对象，得到一个成功的返回对象
     * @create time: 2020/9/17 9:39
     */
    public static MyReturn getSuccessResult(MyReturn myReturn) {
        myReturn.setCode(RetStatusEnum.SUCCESS.getCode());
        myReturn.setMsg(RetStatusEnum.SUCCESS.getMessage());
        return myReturn;
    }

    /**
     * @param myReturn
     * @return MyResult
     * @create by: Teacher陈
     * @description: 传入一个原始返回对象，得到一个失败的返回对象
     * @create time: 2020/9/17 9:39
     */
    public static MyReturn getFailResult(MyReturn myReturn) {
        myReturn.setCode(RetStatusEnum.FAILE.getCode());
        myReturn.setMsg(RetStatusEnum.FAILE.getMessage());
        return myReturn;
    }

    /**
     * @param password
     * @return newPassword
     * @create by: Teacher陈（86521760@qq.com）
     * @description: 密码加密
     * @create time: 2022/6/6 9:53
     */
    public static String makePassword(String password) {
        String md5 = SecureUtil.md5(password);
        return md5;
    }
    /* */

    /**
     * @param password  明文密码
     * @return map  返回封装了加密之后的密码和盐值
     * @create by: Teacher陈（86521760@qq.com）
     * @description: 密码加盐加密
     * @create time: 2022/6/6 9:53
     */
    public static Map<String, String> makePasswordSalt(String password) {
        Map<String, String> map = new HashMap<>();
        //随机生成密钥(盐值)
        byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
        //将盐值转换格式（方便数据库保存）,byte数组转字符串
        String salt = Base64.encode(key);

        //构建加密对象
        SymmetricCrypto aes = null;
        //Base64.decode(salt)，将字符串转换成byte数组
        aes = new SymmetricCrypto(SymmetricAlgorithm.AES, Base64.decode(salt));
        //加密为16进制表示
        String encryptHex = aes.encryptHex(password);
        //加密之后的密文
        map.put("password", encryptHex);
        //盐值，保存盐值的作用是为了登录
        map.put("salt", salt);
        return map;
    }
    /**
     * @param1 password  明文密码
     * @param2 salt  盐值
     * @return string 密文
     * @create by: Teacher陈（86521760@qq.com）
     * @description: 密码加盐加密
     * @create time: 2022/6/6 9:53
     */
    public static String makePasswordSalt(String password,String salt) {
        //构建
        SymmetricCrypto aes = null;
        aes = new SymmetricCrypto(SymmetricAlgorithm.AES, Base64.decode(salt));
        //加密为16进制表示
        String encryptHex = aes.encryptHex(password);
        return encryptHex;
    }

    public static void main(String[] args)  {

    }
}
